package soccerBet.project.Parser;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Session;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import soccerBet.project.contracts.ComboJornadas;
import soccerBet.project.contracts.EquipaContract;
import soccerBet.project.dao.ClassificacaoDAO;
import soccerBet.project.dao.EstatisticasDAO;
import soccerBet.project.dao.InfoPrecosDAO;
import soccerBet.project.dao.RondaDAO;
import soccerBet.project.objects.Classificacao;
import soccerBet.project.objects.EpocaLiga;
import soccerBet.project.objects.Equipa;
import soccerBet.project.objects.Estatisticas;
import soccerBet.project.objects.InfoPrecos;
import soccerBet.project.objects.Jogo;
import soccerBet.project.objects.Ronda;
import soccerBet.project.services.VerificaApostasGanhas;
import soccerBet.project.utils.Utils;


public class Parser 
{ 
	private List<EpocaLiga> epocaLigaList;
	
	
	public Parser()
	{

	}

	
	public Parser(List<EpocaLiga> epocaLigaList)
	{
		this.epocaLigaList = epocaLigaList;
	}

	
	public void actualizaJogos(List<Jogo> jogoObjList, Integer IdEpocaLiga) {
		
		RondaDAO rondaDao = new RondaDAO();
		InfoPrecosDAO infoP = new InfoPrecosDAO();
		EstatisticasDAO estatisticasDao = new EstatisticasDAO();
		
		
		for(int i=0;i<jogoObjList.size();i++){
			
			Utils.buildGameVs(jogoObjList.get(i));
			
			readWebsiteGame(jogoObjList.get(i),IdEpocaLiga);
			
			List<InfoPrecos> infoPrecosList = infoP.getInfoPrecoByJogo(jogoObjList.get(i).getIdJogo());
			List<Estatisticas> estatisticasList = estatisticasDao.getEstatisticasByJogo(jogoObjList.get(i).getIdJogo());
			
			new VerificaApostasGanhas(infoPrecosList,estatisticasList);
			
		}
		
		rondaDao.updateData_act(IdEpocaLiga);
	}
	
	private void readWebsiteGame(Jogo jogo, Integer IdEpocaLiga) {
			
		Document doc = null;
		EstatisticasDAO statsDao = new EstatisticasDAO();
		ClassificacaoDAO classDAO = new ClassificacaoDAO();
		try {
			
			doc = Jsoup.connect("http://www.paulorebelotrader.com/stats/?match="+jogo.getIdJogo()).get();
			
			Elements teste = doc.select("li[class$=f-score odd]"); // a with

			String resultado = teste.get(0).text();
				
			Set<Estatisticas> stats= new HashSet<Estatisticas>();
			
			stats.add(new Estatisticas(jogo,jogo.getEquipaByIdEquipaCasa().getIdEquipa(),Integer.valueOf(teste.get(0).text().split("-")[0])));
			stats.add(new Estatisticas(jogo,jogo.getEquipaByIdEquipaFora().getIdEquipa(),Integer.valueOf(teste.get(0).text().split("-")[1])));
			
			statsDao.insertALLToDB(stats);
		
			//equipa da casa
			Classificacao classObjCasa = classDAO.getClassificacao(jogo.getEquipaByIdEquipaCasa().getIdEquipa());
			
			if(classObjCasa !=null){
				
				classObjCasa =
						efectuaCalculosCasa(jogo.getEquipaByIdEquipaCasa().getIdEquipa(),
								classObjCasa ,Integer.valueOf(teste.get(0).text().split("-")[0]),
										Integer.valueOf(teste.get(0).text().split("-")[1]),
										IdEpocaLiga);
				
				classDAO.updateToDB(classObjCasa);
			}else{
				Classificacao classObj = new Classificacao();
				
				classObj = efectuaCalculosCasa(jogo.getEquipaByIdEquipaCasa().getIdEquipa(),classObj,Integer.valueOf(teste.get(0).text().split("-")[0]),
						Integer.valueOf(teste.get(0).text().split("-")[1]),IdEpocaLiga);
				
				classDAO.insertToDB(classObj);
			}
			
			
			//equipa fora
			Classificacao classObjFora = classDAO.getClassificacao(jogo.getEquipaByIdEquipaFora().getIdEquipa());
			
			if( classObjFora!=null){
				
				 classObjFora = 
						efectuaCalculosFora(jogo.getEquipaByIdEquipaFora().getIdEquipa(),
								 classObjFora
								,Integer.valueOf(teste.get(0).text().split("-")[0])
								,Integer.valueOf(teste.get(0).text().split("-")[1]),
								IdEpocaLiga);
				
				classDAO.updateToDB( classObjFora);
			}else{
				Classificacao classObj = new Classificacao();
				
				classObj = efectuaCalculosFora(jogo.getEquipaByIdEquipaFora().getIdEquipa(),
						classObj,
						Integer.valueOf(teste.get(0).text().split("-")[0]),
						Integer.valueOf(teste.get(0).text().split("-")[1]),
						IdEpocaLiga);
				
				classDAO.insertToDB(classObj);
			}

			
					
		}catch(Exception ex){
			
		}

}
	
	private Classificacao efectuaCalculosCasa(Integer idEquipa, Classificacao classificacaoObj, int goloscasa, int golosfora,int IdEpocaLiga) {
		// TODO Auto-generated method stub
		
		
		classificacaoObj.setEquipa(new Equipa( idEquipa));
		classificacaoObj.setEpocaLiga(new EpocaLiga(IdEpocaLiga));
		
		classificacaoObj.setGolosMarcadosCasa(classificacaoObj.getGolosMarcadosCasa()+goloscasa);
		classificacaoObj.setGolosSofridosCasa(classificacaoObj.getGolosSofridosCasa()+golosfora);
		classificacaoObj.setDataAct(new Date());

	
		classificacaoObj.setJogosCasa(classificacaoObj.getJogosCasa()+1);
		
		if(goloscasa>golosfora)
			classificacaoObj.setPontos(classificacaoObj.getPontos()+3);
		else
			if(goloscasa<golosfora)
				classificacaoObj.setPontos(classificacaoObj.getPontos());
			else
				if(goloscasa==golosfora)
					classificacaoObj.setPontos(classificacaoObj.getPontos()+1);
		
		return classificacaoObj;
	}
	
	private Classificacao efectuaCalculosFora(Integer idEquipa,Classificacao classificacaoObj, int goloscasa, int golosfora,int IdEpocaLiga) {
		// TODO Auto-generated method stub
		
		
		classificacaoObj.setEquipa(new Equipa( idEquipa));
		classificacaoObj.setEpocaLiga(new EpocaLiga(IdEpocaLiga));
		
		classificacaoObj.setGolosMarcadosFora(classificacaoObj.getGolosMarcadosFora()+golosfora);
		classificacaoObj.setGolosSofridosFora(classificacaoObj.getGolosSofridosFora()+goloscasa);
		classificacaoObj.setDataAct(new Date());
		
		
		classificacaoObj.setJogosFora(classificacaoObj.getJogosFora()+1);
		
		if(goloscasa>golosfora)
			classificacaoObj.setPontos(classificacaoObj.getPontos());
		else
			if(goloscasa<golosfora)
				classificacaoObj.setPontos(classificacaoObj.getPontos()+3);
			else
				if(goloscasa==golosfora)
					classificacaoObj.setPontos(classificacaoObj.getPontos()+1);
		
		return classificacaoObj;
	}
	
	

	public void obtemInfo() {
		// TODO Auto-generated method stub
		RondaDAO rondaDao = new RondaDAO();
		
		for(int i=0;i<this.epocaLigaList.size();i++){
			readWebsite(this.epocaLigaList.get(i));
			rondaDao.updateData_act(this.epocaLigaList.get(i).getIdEpocaLiga());
		}
		
	}
	private void readWebsite(EpocaLiga epocaLiga) {
		// TODO Auto-generated method stub
		
		Document doc = null;
		boolean jornadas = false;
		try {
			System.out.println("A obter dados da liga...\n");
			doc = Jsoup.connect("http://www.paulorebelotrader.com/stats/?competition="+epocaLiga.getLiga().getIdLiga()+"&season="+epocaLiga.getIdEpocaLiga()).get();
			
			Elements teste = doc.select("select[class]"); 
			List<ComboJornadas> comboJornadas = new ArrayList<ComboJornadas>();
			for (Element link : teste) {
				
				if(link.attr("name").equals("gw")){
					
					Elements link1 = link.getElementsByTag("option");
					
					for (Element link2 : link1) {
					  String linkHref = link2.attr("value");
					  String linkText = link2.text();
					  
//					  System.out.println("id: "+linkHref+"texto: "+linkText);
					 
					  comboJornadas.add(new ComboJornadas(Integer.parseInt(linkHref)));
					  
					}
					jornadas = true;
					
				}else{
				
					Elements link1 = link.getElementsByTag("option");
					
					for (Element link2 : link1) {
					  String linkHref = link2.attr("value");
					  String linkText = link2.text();
					  
//					  System.out.println("id: "+linkHref+"texto: "+linkText);
					}
				
				}
			}
			
			ParserJornadas parser = new ParserJornadas();
			
			if(jornadas==true){
				for (Ronda r : epocaLiga.getRondas()) {
					
					if(r.getClassificacao()==1){
					
						parser.ObtemJornadas("http://www.paulorebelotrader.com/stats/?competition="
								+epocaLiga.getLiga().getIdLiga()+"&season="+epocaLiga.getIdEpocaLiga()+
								"&round="+r.getIdRonda()+"&group=0&gameweek=",comboJornadas,r.getIdRonda(),epocaLiga.getIdEpocaLiga());
					}
				}
			}else{
				
				//TODO
//				for (Ronda r : epocaLiga.getRondas()) {
//					parser.ObtemJornada("http://www.paulorebelotrader.com/stats/?competition="
//							+epocaLiga.getLiga().getIdLiga()+"&season="+epocaLiga.getIdEpocaLiga()+
//							"&round="+r.getIdRonda(),r.getIdRonda(),epocaLiga.getIdEpocaLiga());
//				}	
			}
		
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}

	
	public Date readWebsiteGame(Jogo jogo) {
		// TODO Auto-generated method stub
		Document doc = null;

		try {
			
			doc = Jsoup.connect("http://www.paulorebelotrader.com/stats/?match="+jogo.getIdJogo()).get();
			
			Elements head = doc.select("td[class$=stats-game-head-date]"); // a with

			
			
			for (Element head_line : head) {
				
				Elements uls = head_line.getElementsByTag("ul");
				
				for (Element ul : uls) {
					
					Elements lis = ul.getElementsByTag("li");
					
					for (Element li : lis ) {
						Elements b  = li.getElementsByTag("b");
						if(b.size()>0){
							Element ab=b.get(0);
							String time = ab.text();
							return Utils.convertStringDateToDateJava(time);
						}
						
					}
				  
					
				}
			}
	
		}catch(Exception ex){
			
		}
		return null;
	}

	

	public void setEpocaLigaList(List<EpocaLiga> epocaLigaList) {
		this.epocaLigaList = epocaLigaList;
	}


	public List<EpocaLiga> getEpocaLigaList() {
		return epocaLigaList;
	}


	

	
}



